package initialize

import (
	"fmt"
	"strconv"

	"gitee.com/jn-shao/common"
	"github.com/asim/go-micro/v3/config"
	"github.com/fsnotify/fsnotify"
	"github.com/go-micro/plugins/v3/config/source/nacos"
	"github.com/nacos-group/nacos-sdk-go/v2/common/constant"
	"github.com/spf13/viper"
	"go.uber.org/zap"

	localconfig "podApi/config"
	"podApi/global"
)

var configFileName = "config.yaml"

func InitConfig() {

	var nacosConfig localconfig.NacosConfig

	if err := GetLocalConfig(configFileName, &nacosConfig); err != nil {
		common.Fatal(err)
	}

	config, err := GetNacosConfig(nacosConfig.Host, nacosConfig.Port, nacosConfig.Namespace,
		nacosConfig.DataId, nacosConfig.Group)
	if err != nil {
		common.Fatal(err)
	}

	if err := config.Get().Scan(&global.ServerConfig); err != nil {
		common.Fatal(err)
	}
}

func GetLocalConfig(localConfigFileName string, config interface{}) error {
	// 读取本地Nacos配置文件
	v := viper.New()
	//文件的路径如何设置
	v.SetConfigFile(localConfigFileName)
	if err := v.ReadInConfig(); err != nil {
		return err
	}

	if err := v.Unmarshal(config); err != nil {
		return err
	}

	fmt.Printf("本地配置信息：%+v", config)
	zap.S().Infof("本地配置信息：%+v", config)
	// viper的功能 - 动态监控变化
	func() {
		v.WatchConfig()
		v.OnConfigChange(func(e fsnotify.Event) {
			fmt.Printf("本地配置文件产生变化：%s", e.Name)
			zap.S().Infof("本地配置文件产生变化：%s", e.Name)
			_ = v.ReadInConfig() // 读取配置数据
			_ = v.Unmarshal(config)
			fmt.Printf("本地配置信息：%+v", config)
			zap.S().Infof("本地配置信息：%+v", config)
		})
	}()

	return nil
}

func GetEnvInfo(env string) bool {
	viper.AutomaticEnv()
	return viper.GetBool(env)
	//刚才设置的环境变量 想要生效 我们必须得重启goland
}

func GetNacosConfig(host string, port uint64, namespace string, dataId string, group string) (config.Config, error) {
	// 创建clientConfig
	clientConfig := constant.ClientConfig{
		// 如果需要支持多namespace，可以场景多个client,它们有不同的NamespaceId。当namespace是public时，此处填空字符串。
		NamespaceId:         namespace,
		TimeoutMs:           5000,
		NotLoadCacheAtStart: true,
		LogDir:              "tmp/nacos/log",   //手动创建该目录
		CacheDir:            "tmp/nacos/cache", //手动创建该目录
		LogLevel:            "debug",
	}
	nacosSource := nacos.NewSource(
		nacos.WithAddress([]string{host + ":" + strconv.FormatUint(port, 10)}),
		nacos.WithClientConfig(clientConfig),
		nacos.WithDataId(dataId),
		nacos.WithGroup(group),
	)
	conf, err := config.NewConfig()
	if err != nil {
		return conf, err
	}
	err = conf.Load(nacosSource)
	return conf, err
}
